package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"time"
)

func calculateChecksum(data []byte) byte {
	var sum uint16
	for _, b := range data {
		sum += uint16(b)
	}
	return byte(sum & 0xFF) // 保留最低8位
}

func AIData() []byte {
	// 创建一个buffer用来构建报文
	var buf bytes.Buffer

	// 写入启动符
	buf.Write([]byte{0x40, 0x40})

	// 写入业务流水号
	buf.Write([]byte{0x00, 0x01})

	// 写入协议版本号
	buf.Write([]byte{0x01, 0x01})

	// 写入时间标签
	currentTime := time.Now()
	packetTimeStamp := []byte{
		byte(currentTime.Second()),
		byte(currentTime.Minute()),
		byte(currentTime.Hour()),
		byte(currentTime.Day()),
		byte(currentTime.Month()),
		byte(currentTime.Year() - 2000),
	}
	buf.Write(packetTimeStamp)

	// 写入源地址和目的地址
	buf.Write([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) // 源地址
	buf.Write([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) // 目的地址

	// 应用数据单元长度先占位，后面再更新
	lengthPos := buf.Len()
	buf.Write([]byte{0x00, 0x00})

	// 写入命令字节
	buf.WriteByte(0x02)

	// 应用数据单元开始
	dataStart := buf.Len()

	// 写入类型标志
	buf.WriteByte(0x03)

	// 写入信息对象数目
	buf.WriteByte(0x02) // 假设只有一个信息对象

	// 写入模拟量数据
	buf.WriteByte(0x0C)                       // 系统类型标志
	buf.WriteByte(0x00)                       // 系统地址
	buf.WriteByte(0x97)                       // 部件类型
	buf.Write([]byte{0x01, 0x00, 0x00, 0x00}) // 部件地址
	buf.WriteByte(0x97)                       // 模拟量类型 (0x97表示液压)
	buf.Write([]byte{0x00, 0x01})             // 模拟量值 1
	buf.Write(packetTimeStamp)                // 写入信息对象的时间标签

	// 写入模拟量数据
	buf.WriteByte(0x0C)                       // 系统类型标志
	buf.WriteByte(0x00)                       // 系统地址
	buf.WriteByte(0x97)                       // 部件类型
	buf.Write([]byte{0x01, 0x00, 0x00, 0x00}) // 部件地址
	buf.WriteByte(0x96)                       // 模拟量类型 (0x96表示液位)
	buf.Write([]byte{0x00, 0x02})             // 模拟量值 2
	buf.Write(packetTimeStamp)                // 写入信息对象的时间标签
	// 计算应用数据单元长度并更新
	dataLength := buf.Len() - dataStart
	binary.LittleEndian.PutUint16(buf.Bytes()[lengthPos:lengthPos+2], uint16(dataLength))

	// 计算校验和，包括从第三字节开始到应用数据单元结束的所有字节
	checksum := calculateChecksum(buf.Bytes()[2:])
	buf.WriteByte(checksum)

	// 写入结束符
	buf.Write([]byte{0x23, 0x23})

	// 输出报文
	fmt.Println("Raw Packet Data:", buf.Bytes())
	return buf.Bytes()
}
